package com.shiyun.generator;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ArrayUtil;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;

public class StaticGenerator {
    public static void copyFileByHutool(String inputPath, String outputPath) {
        FileUtil.copy(inputPath,outputPath,false);
    }

    /**
     * 递归copy文件思路：
     * 1. 在目标位置创建和源项目相同的目录
     * 2. 依次遍历源目录下的所有子文件并复制
     * 3. 如果子文件又是一个目录，则再遍历文件夹下的所有“孙”文件
     *
     */
    public static void copyFileByRecursion(String inputPath,String outputPath){
        //获取源项目目录信息
        File inputFile = new File(inputPath);
        File outputFile = new File(outputPath);
        try{
            copyFileByRecursion(inputFile,outputFile);
        } catch (IOException e) {
            System.out.println("文件复制失败");
            e.printStackTrace();
        }

    }

    public static void copyFileByRecursion(File inputFile, File outputFile) throws IOException {
        String inputFileName = inputFile.getName();
        if(inputFile.isDirectory()) { //如果文件是目录
            File outPutFile = new File(outputFile,inputFileName);//获取源文件名称相同文件
            if(outPutFile.exists() == false) { //如果文件不存在，创建文件
                outPutFile.mkdirs();
            }
            File[] files = inputFile.listFiles(); //获取源项目子文件
            //如果没有子文件
            if(ArrayUtil.isEmpty(files)) {
                return;
            }
            for (File file : files) { //递归复制下一层文件
                copyFileByRecursion(file,outputFile);
            }
        } else { //如果是文件直接复制
            Path path = outputFile.toPath().resolve(inputFileName);//在目标文件创建源文件相同名字路径
            Files.copy(inputFile.toPath(),path, StandardCopyOption.REPLACE_EXISTING);//覆盖复制
        }
    }

    public static void main(String[] args) {
        String projectPath = System.getProperty("user.dir");//获取当前项目路径
        File parentFile = new File(projectPath).getParentFile();// 获取父目录
        //获取模板的绝对路径
        String inputPath = new File(parentFile,"code-generator-demo-projects/acm-template").getAbsolutePath();
        String outputPath = projectPath;
        //复制模版到当前项目根目录
        copyFileByRecursion(inputPath,outputPath);
    }
}
